package com.zijidelu.luframework.infrastructure.converter;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zijidelu.luframework.base.model.DataModel;
import com.zijidelu.luframework.base.model.PO;
import org.mapstruct.MappingTarget;

import java.util.List;

/**
 * 基础转换器。
 *
 * @author ZIJIDELU
 * @date 2024/8/23 22:37
 */
public interface DataConverter<P extends PO, D extends DataModel> {

    /**
     * 创建PO副本。
     *
     * @param source 源PO
     * @return 复制后的PO
     */
    P duplicatePo(P source);

    /**
     * 复制PO。
     *
     * @param source 源PO
     * @param target 目标PO
     * @return 复制后的PO
     */
    P copyPo(P source, @MappingTarget P target);

    /**
     * 创建DataModel副本。
     *
     * @param source 源DataModel
     * @return 复制后的DataModel
     */
    D duplicateData(D source);

    /**
     * 复制DataModel。
     *
     * @param source 源DataModel
     * @param target 目标DataModel
     * @return 复制后的DataModel
     */
    D copyData(D source, @MappingTarget D target);

    /**
     * PO -> DataModel
     *
     * @param po 数据库持久化对象
     * @return DataModel 数据模型
     */
    D poToData(P po);

    /**
     * DataModel -> PO
     *
     * @param data 数据模型
     * @return PO 对象
     */
    P dataToPo(D data);

    /**
     * PO 列表 -> DataModel 列表
     *
     * @param poList PO 列表
     * @return DataModel 列表
     */
    List<D> poToDataList(List<P> poList);

    /**
     * DataModel 列表 -> PO 列表
     *
     * @param dataList DataModel 列表
     * @return PO 列表
     */
    List<P> dataToPoList(List<D> dataList);

    /**
     * 分页实体转换为分页DataModel。
     *
     * @param page 分页实体
     * @return 分页DataModel
     */
    Page<P> dataToPoPage(IPage<D> page);

    /**
     * 分页DataModel转换为分页实体。
     *
     * @param page 分页DataModel
     * @return 分页实体
     */
    Page<D> poToDataPage(IPage<P> page);

}
